graph TD
    A[程序开始] --> B[初始化GLFW]
    B --> C[设置GLFW参数]
    C --> D[创建窗口]
    D --> E{窗口创建成功?}
    E -->|否| F[输出错误信息]
    F --> G[终止GLFW]
    G --> H[返回-1]
    E -->|是| I[设置当前上下文]
    I --> J[初始化GLAD]
    J --> K{GLAD初始化成功?}
    K -->|否| L[输出错误信息]
    L --> M[终止GLFW]
    M --> N[返回-1]
    K -->|是| O[定义两个三角形顶点数据]
    O --> P[创建两个VAO和两个VBO]
    P --> Q[生成VAO和VBO对象]
    Q --> R[绑定第一个VAO和VBO]
    R --> S[载入第一个三角形数据]
    S --> T[设置顶点属性指针]
    T --> U[启用顶点属性]
    U --> V[绑定第二个VAO和VBO]
    V --> W[载入第二个三角形数据]
    W --> X[设置顶点属性指针]
    X --> Y[启用顶点属性]
    Y --> Z[创建顶点着色器]
    Z --> AA[编译顶点着色器]
    AA --> AB{编译成功?}
    AB -->|否| AC[获取并输出错误日志]
    AC --> AD[清理资源]
    AD --> AE[返回-1]
    AB -->|是| AF[创建片段着色器]
    AF --> AG[编译片段着色器]
    AG --> AH{编译成功?}
    AH -->|否| AI[获取并输出错误日志]
    AI --> AJ[清理资源]
    AJ --> AK[返回-1]
    AH -->|是| AL[创建着色器程序]
    AL --> AM[附加着色器到程序]
    AM --> AN[链接着色器程序]
    AN --> AO{链接成功?}
    AO -->|否| AP[获取并输出错误日志]
    AP --> AQ[清理资源]
    AQ --> AR[返回-1]
    AO -->|是| AS[删除着色器对象]
    AS --> AT[激活着色器程序]
    AT --> AU[注册回调函数]
    AU --> AV[进入渲染循环]
    AV --> AW{窗口应关闭?}
    AW -->|是| AX[清理资源]
    AW -->|否| AY[处理输入]
    AY --> AZ[设置清除颜色]
    AZ --> BA[清除颜色缓冲]
    BA --> BB[使用着色器程序]
    BB --> BC[绑定第一个VAO]
    BC --> BD[绘制第一个三角形]
    BD --> BE[绑定第二个VAO]
    BE --> BF[绘制第二个三角形]
    BF --> BG[交换缓冲区]
    BG --> BH[轮询事件]
    BH --> AV
    AX --> BI[终止GLFW]
    BI --> BJ[程序结束]
    AE --> BI
    AK --> BI
    AR --> BI